package delayQueue.javaImpl;

import java.util.concurrent.DelayQueue;

public class Consumer implements Runnable {

    // 延时队列
    private DelayQueue<Message> queue;

    public Consumer(DelayQueue<Message> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while (true) {
            try {
                /**
                 *
                 * 需要始终保证最快到期的消息在队首（关键在于消息实体的compareTo方法），否则会导致到期消息无法及时消费
                 * 查看DelayQueue.take()源码可以发现，它会不断获取队首消息并判断是否到期，队首消息到期才返回结果，
                 * 队首消息没到期：
                 * 1.如果当前没有其他线程等待，则阻塞当前线程直到延迟时间
                 * 2.如果有其他线程在等待，则阻塞当前线程
                 * */
                Message message = queue.take();
                System.out.println("接收到消息内容：" + message.getBody());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

    public DelayQueue<Message> getQueue() {
        return queue;
    }

    public void setQueue(DelayQueue<Message> queue) {
        this.queue = queue;
    }
}
